package com.flower.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.flower.domain.entity.FlowerEncyclopedia;
import com.flower.domain.vo.farmer.FlowerEncyclopediaDetailVO;
import com.flower.domain.vo.farmer.FlowerEncyclopediaVO;

import java.time.LocalDate;
import java.util.List;
import java.util.Map;

/**
 * 花卉百科服务接口
 */
public interface FlowerEncyclopediaService extends IService<FlowerEncyclopedia> {

    /**
     * 分页查询花卉百科列表
     *
     * @param page     页码
     * @param pageSize 每页大小
     * @param params   查询参数
     * @return 分页结果
     */
    Page<FlowerEncyclopediaVO> getEncyclopediaPage(Integer page, Integer pageSize, Map<String, Object> params);

    /**
     * 分页查询待审核花卉列表
     *
     * @param page     页码
     * @param pageSize 每页大小
     * @param keyword   查询参数
     * @return 分页结果
     */
    Page<FlowerEncyclopediaVO> getEncyclopediaAuditsPage(Integer page, Integer pageSize, String keyword);

    /**
     * 获取花卉百科详情
     *
     * @param id 百科ID
     * @return 花卉百科详情
     */
    FlowerEncyclopediaDetailVO getEncyclopediaDetail(Long id);

    /**
     * 添加花卉百科
     *
     * @param detailVO 花卉百科详情
     * @param userId   用户ID
     * @param userType 用户类型(1:花农,2:管理员)
     * @return 添加结果
     */
    boolean addEncyclopedia(FlowerEncyclopediaDetailVO detailVO, Long userId, Integer userType);

    /**
     * 更新花卉百科（存入Redis等待审核）
     *
     * @param id       百科ID
     * @param detailVO 花卉百科详情
     * @param userId   用户ID
     * @param userType 用户类型(1:花农,2:管理员)
     * @return 更新结果
     */
    boolean updateEncyclopedia(Long id, FlowerEncyclopediaDetailVO detailVO, Long userId, Integer userType);

    /**
     * 删除花卉百科
     *
     * @param id 百科ID
     * @return 删除结果
     */
    boolean deleteEncyclopedia(Long id);

    /**
     * 增加浏览次数
     *
     * @param id 百科ID
     */
    void incrementViewCount(Long id);

    /**
     * 获取热门花卉百科
     *
     * @param limit 限制数量
     * @return 热门花卉百科列表
     */
    List<FlowerEncyclopediaVO> getHotEncyclopedias(Integer limit);

    /**
     * 从网络爬取花卉数据
     *
     * @param url 目标URL
     * @return 爬取结果
     */
    boolean crawlFlowerData(String url);
    
    /**
     * 审核通过花卉百科（从Redis读取数据并更新到MySQL）
     *
     * @param id     百科ID
     * @return 更新结果
     */
    boolean updateEncyclopediaStatus(Long id, Integer status);
    
    /**
     * 拒绝花卉百科（删除Redis中的待审核数据）
     *
     * @param id     百科ID
     * @param reason 拒绝原因
     * @return 拒绝结果
     */
    boolean rejectEncyclopedia(Long id, String reason);

    /**
     * 从Excel导入花卉百科数据
     * @param data 从Excel转换的Map数据
     * @return 是否成功
     */
    boolean saveEncyclopediaFromExcel(Map<String, Object> data);

    /**
     * 检查花卉名称是否已存在
     * @param name 花卉名称
     * @return true-存在，false-不存在
     */
    boolean existsByName(String name);
    
    /**
     * 获取Redis中待审核的花卉百科信息
     * 
     * @param id 百科ID
     * @return 花卉百科详情
     */
    FlowerEncyclopediaDetailVO getPendingEncyclopediaFromRedis(Long id);
    
    /**
     * 检查花卉是否有待审核的更新
     * 
     * @param id 百科ID
     * @return true-有待审核更新，false-无待审核更新
     */
    boolean hasPendingUpdate(Long id);

    /**
     * 获取花卉百科总览数据
     * @return 总览数据
     */
    Map<String, Object> getEncyclopediaOverview();

    /**
     * 获取访问量最高的花卉百科数据
     * @param limit 限制数量
     * @return 访问量最高的花卉百科列表
     */
    List<FlowerEncyclopediaVO> getTopViewsEncyclopedias(Integer limit);

    /**
     * 获取花卉百科访问量趋势
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param timeUnit 时间单位（day/week/month）
     * @return 访问量趋势数据
     */
    Map<String, Object> getEncyclopediaViewTrend(LocalDate startDate, LocalDate endDate, String timeUnit);

    /**
     * 获取花卉百科分类分布
     * @return 分类分布数据
     */
    Map<String, Object> getEncyclopediaCategoryDistribution();
} 